#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<iostream>
#include<vector>

typedef void(*handlers_t)();//函数指针类型

std::vector<handlers_t>handlers;//函数指针数组

void fun1()
{
    printf("这是一个临时任务1\n");
}
void fun2()
{
     printf("这是一个临时任务2\n");
}

void Load()
{
    handlers.push_back(fun1);
    handlers.push_back(fun2);
}
//非阻塞等待测试代码

int main()
{
    pid_t id=fork();
    if(id==0)
    {
        //子进程
        int cnt=5;
        while(cnt)
        {
            printf("我是子进程:%d\n",cnt--);
            sleep(1);
        }
        exit(11); //退出码11，仅用来测试
    }
    else{
        int quit=0;
        while(!quit)
        {
            int status=0;
            pid_t res=waitpid(-1,&status,WNOHANG);//以非阻塞方式等待
            if(res>0)
            {
                //等待成功&&子进程退出
                printf("等待子进程退出成功，退出码:%d\n",WEXITSTATUS(status));
                quit=1;
            }
            else if(res==0)
            {
                //等待成功&&但子进程并未退出
                printf("子进程还在运行中，暂时还没有退出，父进程可以再等一等,处理其他事情\n");
                if(handlers.empty())
                {
                    Load();
                }
                for(auto it:handlers)
                {
                    //执行处理其他任务
                    it();
                }
            }
            else 
            {
                //等待失败
                printf("wait失败！\n");
                quit=1;
            }
            sleep(1);
        }
    }
}
